package com.lagou.server;

import com.lagou.QuestionsSystem.QuestionsSys;
import com.lagou.QuzManageSystem.ServerQuzCtrl;
import com.lagou.changePassword.Change;
import com.lagou.model.UserMessage;
import com.lagou.StuManageSystem.ServerStuCtrl;

import java.io.IOException;

/**
 * 编程实现服务器的主功能
 */
public class ServerView {

    /**
     * 使用合成复用原则
     */
    private ServerInitClose sic;
    private ServerDao sd;

    /**
     * 通过构造方法实现成员变量的初始化
     * @param sic
     */
    public ServerView(ServerInitClose sic, ServerDao sd){
        this.sic = sic;
        this.sd = sd;
    }

    /**
     * 自定义成员方法实现客户端发来消息的接收并处理
     */
    public void serverReceive() throws IOException, ClassNotFoundException {
        while(true) {
            UserMessage tum = (UserMessage) sic.getOis().readObject();
            System.out.println("\n接收到的消息是：" + tum);
            //判断客户端的账户信息为管理员或学生
            if ("managerCheck".equals(tum.getType())) {
                //调用方法实现管理员账号和密码信息的校验
                if (sd.serverManagerCheck(tum.getUser())) {
                    tum.setType("success");
                    //将校验结果发送给客户端
                    sic.getOos().writeObject(tum);
                    sic.getOos().flush();
                    System.out.println("\n服务器发送校验结果成功");
                    while(true) {
                        //获取管理员发送的指令进入对应功能
                        String s = sic.getBr().readLine();
                        if ("StudentsManage".equals(s)) {
                            System.out.println("\n接收到进入学生管理系统请求,请求数据为" + s);
                            //声明ServerStuCtrl的引用指向该类的对象
                            ServerStuCtrl ss = new ServerStuCtrl(sic, sd);
                            //调用stuCtrl方法进入学生管理系统
                            ss.stuCtrl();
                        } else if ("QuestionManage".equals(s)) {
                            System.out.println("\n接收到进入考题管理系统请求,请求数据为" + s);
                            //声明ServerQuzCtrl的引用指向该类的对象
                            ServerQuzCtrl sq = new ServerQuzCtrl(sic, sd);
                            //调用quzCtrl方法进入考题管理系统
                            sq.quzCtrl();
                        } else if ("exit".equals(s)) {
                            break;
                        }
                    }
                } else {
                    tum.setType("fail");
                    //将校验结果发送给客户端
                    sic.getOos().writeObject(tum);
                    sic.getOos().flush();
                    System.out.println("\n服务器发送校验结果失败");
                }
            } else if ("userCheck".equals(tum.getType())) {
                //调用方法实现学员账号和密码信息的校验
                if (sd.serverUserCheck(tum.getUser())) {
                    tum.setType("success");
                    //将校验结果发送给客户端
                    sic.getOos().writeObject(tum);
                    sic.getOos().flush();
                    System.out.println("\n服务器发送校验结果成功");
                    while (true) {
                        //获取用户发送的指令进入对应功能
                        String s = sic.getBr().readLine();
                        if ("setPassword".equals(s)) {
                            System.out.println("\n接收到用户修改密码请求,请求数据为" + s);
                            //声明ServerStuCtrl的引用指向该类的对象
                            Change change = new Change(sic, sd);
                            //调用修改密码方法
                            change.changePassword();
                        } else if ("examSystem".equals(s)) {
                            System.out.println("\n接收到用户进入考试系统请求,请求数据为" + s);
                            //声明ServerStuCtrl的引用指向该类的对象
                            QuestionsSys qs = new QuestionsSys(sic, sd);
                            //调用考试系统方法
                            qs.questionsSystem();
                        } else if ("exit".equals(s)) {
                            break;
                        }
                    }
                } else {
                    tum.setType("fail");
                    //将校验结果发送给客户端
                    sic.getOos().writeObject(tum);
                    sic.getOos().flush();
                    System.out.println("\n服务器发送校验结果失败");
                }
            }else{
                break;
            }
        }
    }
}
